package com.gitee.sop.websiteserver.service;

import com.alibaba.fastjson.JSONObject;
import com.gitee.sop.message.util.DateUtils;
import com.gitee.sop.message.util.ObjectUtil;
import com.gitee.sop.mongodb.MongoDbUtil;
import com.gitee.sop.mongodb.MongoQuery;
import com.gitee.sop.websiteserver.constants.TemplateStatus;
import com.gitee.sop.websiteserver.entity.SenderConfig;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.*;

/**
 * 邮箱/短信验证码获取
 *
 * @author wlx
 */
@Component
public class SendCodeHandler {
    @Resource
    private MongoDbUtil mongoDbUtil;

    /**
     * 新增消息核心配置信息
     *
     * @param senderConfig
     */
    public void addMessageConfig(SenderConfig senderConfig) {
        String appId = senderConfig.getAppId();
        String type = senderConfig.getType();
        String id = senderConfig.getId();
        if ("auto".equals(type)) {
            //@TODO 1、自配置短信/邮箱配置信息型，配置好相关参数即可使用
            //查询数据库中指定APP应用已开启的配置信息，若有则并将其修改为禁用状态
            List<MongoQuery> mongoQueries = new ArrayList<>();
            mongoQueries.add(new MongoQuery("appId", appId));
            mongoQueries.add(new MongoQuery("status", TemplateStatus.normal.getCode()));
            JSONObject jsonObject = mongoDbUtil.queryOne(getCollectionName(), mongoQueries, JSONObject.class);
            if (Objects.nonNull(jsonObject)) {
                String _id = jsonObject.get("_id").toString();
                if (StringUtils.isNotBlank(id) && id.equals(_id)) {
                    List<Object> ids = new ArrayList<>();
                    ids.add(id);
                    mongoDbUtil.deleteDocument(getCollectionName(), "_id", ids);
                } else {
                    //已存在开启的配置信息，将其修改为禁用状态
                    jsonObject.put("status", TemplateStatus.DISABLE.getCode());
                    mongoDbUtil.updateOne(getCollectionName(), "_id", jsonObject.getString("_id"), jsonObject);
                }
            }
            //整理对应模板配置参数，并生成有效的开始和结束时间，保存到数据库中
            JSONObject extData = senderConfig.getExtData();
            if (Objects.nonNull(extData)) {
                senderConfig.setStatus(TemplateStatus.normal.getCode());
                senderConfig.setStartTime(new Date());
                Date endDate = DateUtils.addDays(senderConfig.getStartTime(), 365);
                senderConfig.setEndTime(endDate);
                Map<String, Object> map = ObjectUtil.toMap(senderConfig);
                map.remove("extData");
                map.remove("id");
                extData.putAll(map);
                extData.remove("_id");
                //存入数据库
                List<JSONObject> list = new ArrayList<>();
                list.add(extData);
                mongoDbUtil.insertDocument(getCollectionName(), list);
            }
        } else if ("pay".equals(type)) {
            //@TODO 2、收费使用，支付完成后可在有效期内直接使用


        }
    }

    public JSONObject initConfig(String appId) {
        List<MongoQuery> mongoQueries = new ArrayList<>();
        mongoQueries.add(new MongoQuery("appId", appId));
        mongoQueries.add(new MongoQuery("status", TemplateStatus.normal.getCode()));
        JSONObject jsonObject = mongoDbUtil.queryOne(getCollectionName(), mongoQueries, JSONObject.class);
        if (Objects.nonNull(jsonObject)) {
            return jsonObject;
        }
        return null;
    }

    protected String getCollectionName() {
        return "senderConfig";
    }


    /**
     * 集合是否存在，不存在则创建
     */
    @PostConstruct
    protected void collectionExists() {
        boolean exists = mongoDbUtil.collectionExists(getCollectionName());
        if (!exists) {
            mongoDbUtil.createCollection(getCollectionName());
        }
    }
}